#!/usr/bin/perl 

$PROCDIR=$ENV{'PROCDIR'};
$REPODIR=$ENV{'REPODIR'};
$archivo_combos="$PROCDIR/combos.dis";
$archivo_reservas="$PROCDIR/reservas.ok";

# obtenerCandidatos(eventos)
# PRE: eventos ordenados por id combo
sub obtenerCandidatos {
	@eventos=@_;
	my @evento;
	$last_id_ok="";
	for($i=0;$i<=$#eventos;$i++){
    	next if $last_id_ok eq $eventos[$i]{id_combo};		
    	# si tiene referencia (1) y tiene butacas confimadas (6) es candidato.			
    	if ($eventos[$i]{ref_int} ne "" and $eventos[$i]{cant_confirm} > 0){
    		push @candidatos, { detalle => "$eventos[$i]{nombre_obra}: $eventos[$i]{fecha} - $eventos[$i]{hora}", id_combo => $eventos[$i]{id_combo} };
    	 $last_id_ok=$eventos[$i]{id_combo};
    	}
	}
@candidatos;
}

# Descripcion: imprime por pantalla la cadena pasada por parametro
# y opcionalmente a un archivo.
# Parametros:
# 0: cadena a imprimir
# 1: array con handlers de archivo. Ej: qw/STDOUT REPORTE/
sub imprimir {
	my($mensaje, @archivos) = @_;
	foreach (@archivos) {
		print $_ $mensaje;
	}
}

# Descripcion: imprime los invitados del evento con ID OBRA
# pasado como parametro.
# Parametros:
# 0: 1 para grabar en archivo, 0 en caso contrario.
# PRE: eventos ordenados por COMBO y REF
sub imprimirReporteInvitados{
	my($id_combo,$grabar,@eventos)=@_;

	$i=0;
	$i++ while($eventos[$i]{id_combo} ne $id_combo);

    if(defined($grabar) and $grabar eq 1){				 	 	
    	$archivo="$REPODIR/$id_combo.inv";
    	unlink($archivo) if -e $archivo; # borrar si existe
    	open(REPORTE, ">$archivo") or die "Error: no se pudo crear $archivo";
    	@archivos=qw/STDOUT REPORTE/;
    } else {
    	@archivos=qw/STDOUT/;
    }

	while ($eventos[$i]{id_combo} eq $id_combo){
		if($eventos[$i]{ref_int} ne ""){
			 $linea="-"x80;
			 &imprimir("\n$linea\n", @archivos);
			 &imprimir("Evento: $eventos[$i]{id_combo} Obra: $eventos[$i]{id_obra} ". 
			 	"$eventos[$i]{nombre_obra} Fecha y Hora: $eventos[$i]{fecha} ". 
			    "$eventos[$i]{hora} Hs. Sala: $eventos[$i]{id_sala}-$eventos[$i]{nombre_sala}\n", @archivos);
			 &imprimir("REFERENCIA INTERNA DEL SOLICITANTE: $eventos[$i]{ref_int}\n", @archivos);
			
			 if(open(INVITADOS, "$REPODIR/$eventos[$i]{ref_int}.inv")){
			   $invitados_acumulados=0;			   
			   while(<INVITADOS>){
			   	 chomp;
	        	 @invitado=split(';',$_);
	        	 $invitado[2] = "0" if $invitado[2] eq ""; 
	        	 $invitados_acumulados+=$invitado[2]+1;	        	 
	        	 &imprimir("Nombre: $invitado[0], Acomp.: $invitado[2], TOTAL ACUM.: $invitados_acumulados\n", @archivos);		       		         
		   	    }
		   	    close INVITADOS;
		   	    &imprimir("\n#Total butacas confimadas: $eventos[$i]{cant_confirm}, #Total invitados: $invitados_acumulados\n", @archivos);
	         } else {
	        	&imprimir("Sin listado de invitados.\n", @archivos);
	         } 
		}
	$i++;
	}

	close(REPORTE) if $grabar == 1;
}

# Descripcion: imprime por pantalla el reporte de invitados segun la
# seleccionada.
# Parametros: 1 para grabar a archivo, 0 en caso contrario.
sub reporteInvitados {
	$grabar=$_[0];
	@eventos_ordenado=&getReservasOrdenado(id_combo);
	@eventos_candidato=&obtenerCandidatos(@eventos_ordenado);

		print "\nREPORTE DE INVITADOS: \n";
		for ($i=0; $i<= $#eventos_candidato; $i++){
	 	 print("$i) $eventos_candidato[$i]{detalle} \n");
	 	}		
	    print "\nSeleccione evento para generar reporte... (Salir: s)\n";
	    $opt=<STDIN>; chomp($opt); 
	    last if $opt eq "s";

	    $opt+=0;
	    if($opt >= 0 and $opt <= $#eventos_candidato){
	    	#print "$eventos_candidato[$opt]{id_combo}\n"; 
	     &imprimirReporteInvitados($eventos_candidato[$opt]{id_combo}, $grabar,@eventos_ordenado);
	   	}
}


sub mostrarAyuda{
	print "Imprimir_B.pl -opcion [-w]: \n".
		  "Opciones: \n".
		  "-i: reporte de invitados.\n".
		  "-d: listado de disponibilidades.\n".
		  "-r: genera ranking de solicitantes.\n".
		  "-t: genera listado de tickets.\n".
		  "-a: ayuda\n".
		  "[-w] grabar reporte a archivo (opcional)\n";
}

# Retorna un array de hashes donde cada hash es una entrada del archivo de reservas) 
# ordenado por el campo pasado por parametro (ej: id_obra)
sub getReservasOrdenado {
	my $campo_orden=$_[0];
    open(RESERVAS,$archivo_reservas) || die "Archivo de reservas.ok $archivo_reservas no existe!";
    $i=0;
 	while(<RESERVAS>){
 		@a_reserva=split(";",$_);
 		$archivo_reservas[$i++]= { id_obra 	=> $a_reserva[0],
 							 nombre_obra => $a_reserva[1],
 							 fecha   	=> $a_reserva[2],
 							 hora 		=> $a_reserva[3], 
 							 id_sala 	=> $a_reserva[4],
							 nombre_sala => $a_reserva[5],
							 cant_confirm=> $a_reserva[6],
							 id_combo	=> $a_reserva[7],
							 ref_int		=> $a_reserva[8],
							 cant_but_sol=> $a_reserva[9],
							 correo		=> $a_reserva[10],
							 fecha_grab	=> $a_reserva[11],
							 usuario_grab=> $a_reserva[12]
						   };
 	}
 	# Si es un numerico hay que usar <=> en lugar de cmp
	@archivo_reservas= sort { $a->{id_combo} cmp $b->{id_combo} } @archivo_reservas;

close(RESERVAS);
@archivo_reservas;
}

# generarTickets(id_combo,(0|1),@reservas_ordenadas)
# PRE: las reservas deben estar ordenadas por combo id.
# Retorna:
#  0: finalizo correctamente
# -1: si no se encontraron reservas para tal combo.
sub generarTickets {
  my($id_combo,$grabar,@reservas) = @_;

  $encontrado=0;

  $i=0;
  while($encontrado == 0 and $i<=$#reservas){
	if ($reservas[$i]{id_combo} eq $id_combo){

		$encontrado=1;

       	# grabar en <combo id>.tck	si seteo -w en params
        if(defined($grabar) and $grabar eq 1){	
        	$archivo="$REPODIR/$id_combo.tck";
        	unlink($archivo) if -e $archivo; # borrar si existe
        	open(TICKETS, ">>$archivo") or die "Error: no se pudo crear $archivo";
        	@archivos=qw/STDOUT TICKETS/;
        } else {
        	@archivos=qw/STDOUT/;
        }
        # Proceso reservas con el combo id solicitado
		while($reservas[$i]{id_combo} eq $id_combo and $i <= $#reservas){
			$cant_confirm=$reservas[$i]{cant_confirm};

			# Agrega tickets para esta reserva (si son 5 confirmados agrega 2+2+1)
			while($cant_confirm>=1){
				if($cant_confirm==1){
				  $tipo_comprobante="VALE POR 1 ENTRADA";
				$cant_confirm-=1;
				} else {
				  $tipo_comprobante="VALE POR 2 ENTRADAS";
				$cant_confirm-=2;					
				}	

				 &imprimir("$tipo_comprobante;".
    					   "$reservas[$i]{nombre_obra};".
    					   "$reservas[$i]{fecha};".
    					   "$reservas[$i]{hora};".
    					   "$reservas[$i]{nombre_sala};".
    					   "$reservas[$i]{ref_int};".
    					   "$reservas[$i]{correo}\n", @archivos);
			}
			# procesar otra reserva con el mismo combo
			$i++;			
		}      
	} 
	$i++;              
 }
   close(TICKETS) if $grabar==1 and $encontrado==1;
   return -1 if $encontrado==0;
return 0;
}

# comboExiste(id combo): retorna 1 si el id combo existe o 0 si no.
sub comboExiste {
	open(COMBOS,$archivo_combos) || die "Archivo $archivo_combos no existe!";
	$encontrado=0;
	while(<COMBOS>){
		@combo=split(";",$_);
		if ($combo[0] eq $id_combo){
			$encontrado=1;
			last;
		}
	}
	close(COMBOS);
return $encontrado;
}

# reporteTickets(0|1)
# Graba en archivo si llega 1 como parametro, sino solo muestra por pantalla.
sub reporteTickets {
	$grabar=$_[0];
	$error=0;
	@reservas=getReservasOrdenado(id_combo);
	do {
		print "Ingrese un id Combo valido (Salir: s): ";
		$id_combo=<STDIN>; chomp($id_combo);

	} while (($id_combo ne "s") and (comboExiste($id_combo) == 0));
	
	$error=generarTickets($id_combo,$grabar,@reservas) if $id_combo ne "s";

	print "Sin reservas para combo $id_combo." if $error==-1;
}

# reporteRanking
sub reporteRanking {
	$grabar=$_[0];
	
	$rutaReservasOk = "$PROCDIR/reservas.ok";
	#$rutaReservasOk = "reservas.ok";
	
	open (archReservas,"<$rutaReservasOk") || die "Error: No puede abrirse el archivo especificado.\n";

	while ($linea = <archReservas>){
		
		@registro = split(';', $linea);
		$tabla{@registro[10]} = $tabla{@registro[10]} + @registro[9];
		
	}

	($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime;

	$i = 1;
	print "10 Principales Solicitantes:\n";
	print "Fecha ".($year+1900)."/".($mon+1)."/".$mday." ".$hour.":".$min.":".$sec."\n";
	print "|| CORREO		|| CANTIDAD	||\n";

	foreach $value (sort {$tabla{$b} <=> $tabla{$a}} keys %tabla) {
		 if ($i <= 10) {
			print "|| $value		|| $tabla{$value}	||\n";
			$i++;
		}
	}

	if(defined($grabar) and $grabar eq 1){    
		 	
		$extension = ($year-100).($mon+1).$mday.$hour.$min.$sec;
		
		$rutaRanking = "$REPODIR/ranking.".$extension;
		
		open (archRanking,">$rutaRanking") || die "Error: No puede abrirse el archivo especificado.\n";
		
		$i = 1;
		print archRanking "10 Principales Solicitantes:\n";
		print archRanking "Fecha ".($year+1900)."/".($mon+1)."/".$mday." ".$hour.":".$min.":".$sec."\n";
		print archRanking "|| CORREO		|| CANTIDAD	||\n";
		
		foreach $value (sort {$tabla{$b} <=> $tabla{$a}} keys %tabla) {
			if ($i <= 10) {
				print archRanking "|| $value		|| $tabla{$value}	||\n";
				$i++;
			}
		}
		
		close(archRanking);
	}

	close(archReservas);
}


sub reporteDisponibilidad {
  print "\n";
          print "  1  Buscar Id Obra\n";
          print "  2  Buscar Rango Id Obra\n";
          print "  3  Buscar Id Sala\n";
          print "  4  Buscar Rango Id Sala \n";
          print "\n";
    
  $obra=<STDIN>;
  $error = &validarRespuestaNum($obra);
  while ( $error == -1 ){
      $obra = <STDIN>;
      chomp($obra);
      $error = &validarRespuestaNum( $obra );
  }

  if($obra == 1){
    my  $z = &BuscarIDObra
  }
  if($obra == 2){
    my  $z = &orden
  }
  if($obra == 3){
    my  $z = &BuscarIDSala
  }
  if($obra == 4){
   my  $z = &ordenRangoSala
  }
}

sub validarRespuestaNum{
  my $rta = @_[0];
  if (($rta >= 1) && ($rta <= 4)){
    return(1);
  } else {
    print "¡Respuesta incorrecta!,Debe ingresar 1,2,3,4\n";
    return(-1);
  }
}

sub BuscarIDObra{
   $grabar=$_[0];
    open(DISPONIBLES, $archivo_combos)  or die "Archivo de combo no existe!";
     my @array;
     $i=0;
      while (<DISPONIBLES>){
         @combo=split(";",$_);
         $combos[$i++]={ c1=>$combo[0], c2=>$combo[1], c3=>$combo[2], c4=>$combo[3], c5=>$combo[4], c6=>$combo[5], c7=>	$combo[6]};
       }

     my @combos= sort { $a->{c2} <=> $b->{c2} } @combos;
     print "Ingrese un id de Obra\n";
     chomp($BusIDobra = <STDIN>);
     for($i=0;$i<=$#combos;$i++){ 
        my $rta= "\n   $combos[$i]{c1}   $combos[$i]{c2}      $combos[$i]{c3}       $combos[$i]{c4}         $combos[$i]{c5}        $combos[$i]{c6}          $combos[$i]{c7}\n";
        my $i = " $combos[$i]{c2}";
        push(@array,$i);
       
        if(($i) == $BusIDobra){
          push(@vector,$rta);
        }            
     }
   
      $arraySize = @vector;
      $arraySize = scalar (@vector);
      $arraySize = $#vector + 1;

    if ($arraySize == 0){
     &IngresarNuevoIdObra;
    } else {
     my @resultado = @{mostrar( \@vector)};      
     if(defined($grabar) and $grabar eq 1){
        print"\n";
        print"Ingrese nombre de  Archivo y la extencion\n";
          $nombre = <STDIN>;
       &grabarRecalculo($nombre,@vector);       
     }    
   }
    close DISPONIBLES;     
}

sub orden {
 $grabar=$_[0];
 open(COMBOS,$archivo_combos);
 $i=0;
 while(<COMBOS>){
   @combo=split(";",$_);
   $combos[$i++]={ c1=>$combo[0], c2=>$combo[1], c3=>$combo[2], c4=>$combo[3], c5=>$combo[4], c6=>$combo[5], c7=>$combo[6]};
 }
  my @combos= sort { $a->{c2} <=> $b->{c2} } @combos;
  print "Ingrese un rango de Id Obra [num1 num2]\n";
  $RangoIDobra=<STDIN>;
  my @Aux;
  my @Rang;
  @Aux = split(' ',$RangoIDobra);
  if (@Aux[0] > @Aux[1]){
   @Aux = reverse(@Aux);
  } 
  my @vector;
  for($i=0;$i<=$#combos;$i++){
     my $rta ="\n  $combos[$i]{c1}    $combos[$i]{c2}       $combos[$i]{c3}         $combos[$i]{c4}      $combos[$i]{c5}    	 $combos[$i]{c6}        $combos[$i]{c7}\n";
     my $i = "$combos[$i]{c2}"; 
     if(($i > @Aux[0]) && ($i< @Aux[1])){
       push(@vector,$rta);
     }
  }

  $arraySize = @vector;
  $arraySize = scalar (@vector);
  $arraySize = $#vector + 1;

  if ($arraySize == 0){    
    &IngNuevoRangoObra
  } else {
     my @resultado = @{mostrar( \@vector)};
     if(defined($grabar) and $grabar eq 1){
        print"\n";
        print"Ingrese nombre de  Archivo y la extencion\n";
        $nombre = <STDIN>;
        &grabarRecalculo($nombre,@vector);
     }
   }
   close(COMBOS);
}

sub BuscarIDSala{
 $grabar=$_[0];
 open(DISPONIBLES, $archivo_combos)  or die "Archivo de combo no existe!";
 my @array;
 my $BusIDsala;
 $i=0;
 while (<DISPONIBLES>){
    @combo=split(";",$_);
    $combos[$i++]={ c1=>$combo[0], c2=>$combo[1], c3=>$combo[2], c4=>$combo[3], c5=>$combo[4], c6=>$combo[5], c7=>	$combo[6] };
 }

 my @combos= sort { $a->{c5} <=> $b->{c5} } @combos;
 print "Ingrese un id de Sala\n";
 chomp($BusIDsala = <STDIN>);
 for($i=0;$i<=$#combos;$i++){
     my $rta="\n   $combos[$i]{c1}   $combos[$i]{c2}       $combos[$i]{c3}       $combos[$i]{c4}         $combos[$i]{c5}       $combos[$i]{c6}          $combos[$i]{c7}\n";
     my $i = " $combos[$i]{c5}";
     push(@array,$i);     
  	 if(($i) == $BusIDsala){
    	 push(@vector,$rta);
     }
  }
   
  $arraySize = @vector;
  $arraySize = scalar (@vector);
  $arraySize = $#vector + 1;

  if ($arraySize == 0){
     &IngresarNuevoIdSala;
  } else {
     my @resultado = @{mostrar( \@vector)};
     if(defined($grabar) and $grabar eq 1){
        print"\n";
        print"Ingrese nombre  de  Archivo y la extencion\n";
        $nombre = <STDIN>;
        &grabarRecalculo($nombre,@vector);
     }
  }
close DISPONIBLES;     
}

sub ordenRangoSala{
    $grabar=$_[0];
    open(COMBOS,$archivo_combos);
    $i=0;
    while(<COMBOS>){
      @combo=split(";",$_);
      #meto algunos campos del archivo en un hash y despues en un array
      $combos[$i++]={ c1=>$combo[0], c2=>$combo[1], c3=>$combo[2], c4=>$combo[3], c5=>$combo[4], c6=>$combo[5], c7=>$combo [6],};
    }
    my @combos= sort { $a->{c5} <=> $b->{c5} } @combos;
    #print "COMBOS ORDENADO\n";
    print "Ingrese un rango de Id Sala [num1 num2]\n";
    $RangoIDsala=<STDIN>;
    my @Aux;
    my @Rang;

    @Aux = split(' ',$RangoIDsala);
    
    if (@Aux[0] > @Aux[1]){
     @Aux = reverse(@Aux);
    } 

    my @vector;
    for($i=0;$i<=$#combos;$i++){
     #my $rta ="$combos[$i]{c1}   $combos[$i]{c2}       $combos[$i]{c3}       $combos[$i]{c4}        $combos[$i]{c5}          $combos[$i]{c6}         $combos[$i]{c7}         $combos[$i]{c8}" ;
      my $rta ="\n   $combos[$i]{c1}    $combos[$i]{c2}      $combos[$i]{c3}        $combos[$i]{c4}        $combos[$i]{c5}       $combos[$i]{c6}           $combos[$i]{c7}\n";
      my $i = " $combos[$i]{c5}"; 
      if(($i > @Aux[0]) && ($i< @Aux[1])){
        push(@vector,$rta);    
      }
    }
    $arraySize = @vector;
    $arraySize = scalar (@vector);
    $arraySize = $#vector + 1;
    if ($arraySize == 0){
      &IngNuevoRangoSala;
    } else {
       my @resultado = @{mostrar( \@vector)};     
       if(defined($grabar) and $grabar eq 1){
          print"\n";
          print"Ingrese nombre  de  Archivo y la extencion\n";
           $nombre = <STDIN>;
          &grabarRecalculo($nombre,@vector);
       }
     }
close(COMBOS);
}

sub IngNuevoRangoObra{
   print "No existen Rangos de Obra para el id Ingresado\n";
   &orden
}

sub IngNuevoRangoSala{
  print "No existe Rangos de Sala para el id Ingresado\n";
  &ordenRangoSala
}

sub confirma{    
    my $mensaje = @_[0];
    my $respuesta = -1;
    while ( $respuesta == -1 ){
        print $mensaje;
        $rta = <STDIN>;
        chomp($rta);        
        $respuesta = &validarRespuesta( $rta );     
    }
    return $respuesta;
}

sub validarRespuesta{    
    my $rta = @_[0];    
    if ( uc($rta) eq uc("n") ){
        return(0);
        last;
    }
    elsif ( uc($rta) eq uc("s") ){
        return(1);
    } else  {
        print "¡Respuesta incorrecta!";
        return(-1);
    }
}

sub mostrar{
  my ($rarreglo1) = @_;
  my @vector=@$rarreglo1;  
    print "\n";
    printf("%3s");
    print "ID_COMBO  ID_OBRA  FECHA_FUNCION  HORA_FUNCION  ID_SALA  BUTACAS_HAB  BUTACAS_DIS\n ";
    foreach $vectore(@vector){
     printf("%3s");
     print "$vectore";
    }
}


sub grabarRecalculo{
  my $nombreArchivo = @_[0];
  my @vector = @_;
  my $linea;
  my $item;
  open(ARCHIVO_REPORTE,">>$REPODIR/$nombreArchivo") || die "ERROR: No puedo abrir el fichero $nombreArchivo\n";
  foreach $item (@vector){
   $item =~ s/\r|\n//g;
   print ARCHIVO_REPORTE "$item\n";
  }
  close(ARCHIVO_REPORTE);
}

sub IngresarNuevoIdObra{
   print "No existe el id Obra Ingresado\n";
   &BuscarIDObra

}

sub IngresarNuevoIdSala{
  print "No existe el id Sala Ingresado\n";
   &BuscarIDSala
}


sub menu {
	my $grabar=0;
	my $funcion_a_llamar="";
	if(0 <= $#ARGV and $#ARGV <= 2){
		while(@ARGV){
			$_=shift(@ARGV);
			if   (/-w/) { $grabar=1; }
			elsif(/-i/) { $funcion_a_llamar='reporteInvitados'; }
			elsif(/-t/) { $funcion_a_llamar='reporteTickets'; }
			elsif(/-a/) { $funcion_a_llamar='mostrarAyuda'; }
			elsif(/-d/) { $funcion_a_llamar='reporteDisponibilidad'; }
			elsif(/-r/) { $funcion_a_llamar='reporteRanking'; }
			else        { return 1; }
		}
		eval "$funcion_a_llamar($grabar)";
		return 0;
	}
	print "Error: faltan parametros\n";
	&mostrarAyuda;
return 1;
}


&menu;
